\section{\href{https://www.apiref.com/cpp-zh/cpp/utility/variant.html}{std::variant}}
\begin{cpp}
//定义于头文件 <variant>
template <class... Types>
class variant;//(C++17 起)
\end{cpp}
类模板 std::variant 表示一个类型安全的联合体。 std::variant 的一个实例在任意时刻要么保有其一个可选类型之一的值，要么在错误情况下无值（此状态难以达成，见 valueless\_by\_exception ）。与联合体在聚合初始化中的行为一致, 若 variant 保有某个对象类型 T 的值，则直接于 variant 的对象表示中分配 T 的对象表示。不允许 variant 分配额外的（动态）内存。variant 不容许保有引用、数组，或类型 void 。空 variant 亦为病式（可用 std::variant< std::monostate> 代替）。variant 容许保有同一类型多于一次，而且可保有同一类型的不同 cv 限定版本。同联合体，默认构造的 variant 保有其首个选项的值，除非该选项不是可默认构造的（该情况下 variant 亦非可默认构造：能用辅助类 std::monostate 使这种 variant 可默认构造）。

模板形参Types：可存储于此 variant 中的类型。所有类型必须满足可析构 (Destructible) 要求（特别是不允许数组类型和非对象类型）。
\begin{itemize}
    \item 成员函数(构造函数)
    \item 构造 variant 对象(公开成员函数)(析构函数)
    \item 析构 variant 同其所含的值(公开成员函数)
    \item operator=赋值 variant(公开成员函数)
    \item index：返回 variant 所保有可选项的零基下标(公开成员函数)
    \item valueless\_by\_exception：检查 variant 是否在非法状态(公开成员函数)
    \item emplace：原位构造 variant 中的值(公开成员函数)
    \item swap：与另一 variant 交换(公开成员函数)非成员函数
    \item visit (C++17) 以一或多个 variant 所保有的各实参调用所提供的函数对象(函数模板)
    \item holds\_alternative(C++17)：检查某个 variant 是否当前持有某个给定类型(函数模板)
    \item std::get(std::variant)(C++17)：以给定索引或类型（若类型唯一）读取 variant 的值，错误时抛出异常(函数模板)
    \item get\_if(C++17)：以给定索引或类型（若其唯一），获得指向被指向的 variant 的值的指针，错误时返回空指针(函数模板)
    \item operator==(C++17)、operator!=(C++17)、operator<(C++17)、operator<=(C++17)、operator>(C++17)、operator>=(C++17)、operator<=>(C++20)：以所含值比较 variant 对象(函数模板)
    \item std::swap(std::variant)(C++17)：特化 std::swap 算法(函数)
    \item monostate(C++17)：用作非可默认构造类型的 variant 的首个可选项的占位符类型(类)
    \item bad\_variant\_access(C++17)：非法地访问 variant 的值时抛出的异常(类)
    \item variant\_size、variant\_size\_v(C++17)：在编译时获得 variant 可选项列表的大小
    \item variant\_alternative、variant\_alternative\_t(C++17)：在编译时获得以其下标指定的可选项的类型
    \item std::hash<std::variant>(C++17)：特化 std::hash 算法(类模板特化)
    \item variant\_npos(C++17)：非法状态的 variant 的下标(常量)
\end{itemize}
\cppfile{sample/variant_demo.cc}
\section{\href{https://www.apiref.com/cpp-zh/cpp/utility/any.html}{std::any}}
\begin{cpp}
    //定义于头文件 <any>
    class any;// (C++17 起)
\end{cpp}
类 any 描述用于任何类型的单个值的类型安全容器。
\begin{enumerate}
    \item 类 any 的对象存储任何满足构造函数要求的类型的一个实例或为空，而这被称为 any 类对象的状态。存储的实例被称作所含对象。若两个状态均为空，或均为非空且其所含对象等价，则两个状态等价。
    \item 非成员 any\_cast 函数提供对所含对象的类型安全访问。
          鼓励实现避免小对象的动态分配，但这种优化仅可以应用于 std::is\_nothrow\_move\_constructible 对其返回 true 的类型。
\end{enumerate}
相关成员函数：
\begin{itemize}
    \item (构造函数)：构造 any 对象(公开成员函数)
    \item operator=：赋值 any 对象(公开成员函数)
    \item (析构函数)：销毁 any 对象(公开成员函数)
    \item emplace：更改所含对象，直接构造新对象(公开成员函数)
    \item reset：销毁所含对象(公开成员函数)
    \item swap：交换二个 any 对象(公开成员函数)
    \item has\_value：检查对象是否含有值(公开成员函数)
    \item type：返回所含值的 typeid(公开成员函数)
    \item std::swap(std::any)(C++17)：特化 std::swap 算法(函数)
    \item any\_cast(C++17)：对被容纳对象的类型安全访问(函数模板)
    \item make\_any(C++17)：创建 any 对象(函数模板)
    \item bad\_any\_cast(C++17)：当类型不匹配时按值返回形式的 any\_cast 所抛出的异常(类)
\end{itemize}
\cppfile{sample/any_demo.cc}
